﻿using Bettzueche.RLLibrary.Types;

namespace Bettzueche.DampfrossContinuum
{
    /// <summary>
    /// Interface für Merkmale. Je nach Implementierung werden die Merkmalsdimensionen disjunktiv
    /// und / oder konjunktiv verknüpft. Daher muss für jede Kombinationsart eine eigene <see cref="GetFeatureSet"/>
    /// Methode implementiert werden, die aus den Zustandseigenschaften bspw. mittels <c>MultiTiling</c> die Merkmale
    /// (bzw. die Merkmalsnummern) des Zustands wiedergibt.
    /// </summary>
    /// <typeparam name="TState">The type of the state.</typeparam>
    public interface IFeatures<TState> where TState : IState
    {
        /// <summary>
        /// Gibt die Merkmalsmenge(bzw. die Merkmalsnummern), die aus den Zustandseigenschaften bspw. mittels 
        /// <c>MultiTiling</c> ermittelt werden.
        /// </summary>
        /// <param name="state">Der Zustand</param>
        /// <returns>IDs (Indizes) der Merkmale, die zu den übergebenen Zustandsdaten gehören.</returns>
        int[] GetFeatureSet(TState state);

        /// <summary>
        /// Optional! Gets the state from features.
        /// </summary>
        /// <param name="features">The features.</param>
        /// <returns></returns>
        TState GetStateFromFeatures(int[] features);
    }
}
